package com.yuji.aacar.core.cores.utils;

import android.util.Log;

import com.yuji.aacar.net.config.BlueLog;

import java.io.BufferedWriter;
import java.io.File;
import java.io.FileWriter;
import java.io.IOException;
import java.text.SimpleDateFormat;
import java.util.Calendar;
import java.util.Date;


/**
 * <li>Package:com.ttp.core.mvvm.appbase
 * <li>Author: lining
 * <li>Date: 2017/2/14
 * <li>Description:
 * <br> 日志工具 </br>
 */
public class LogUtil {

    public static LogUtil instance;
    /**日志文件总开关*/
    private static Boolean MYLOG_SWITCH=false;
    /** 日志文件 error 以下总开关*/
    private static Boolean MYLOG_SWITCH_EXCEPT_ERROR=true;
     /** 日志写入文件开关*/
    private static Boolean MYLOG_WRITE_TO_FILE=false;
     /** 输入日志类型，w代表只输出告警信息等，v代表输出所有信息*/
    private static char MYLOG_TYPE='v';
     /** 日志文件在sdcard中的路径*/
    private static String MYLOG_PATH_SDCARD_DIR="/sdcard/";
     /** sd卡中日志文件的最多保存天数*/
    private static int SDCARD_LOG_FILE_SAVE_DAYS = 0;
     /** 本类输出的日志文件名称*/
    private static String MYLOGFILEName = "Log.txt";
     /** 日志的输出格式*/
    private static SimpleDateFormat myLogSdf = new SimpleDateFormat(  
            "yyyy-MM-dd HH:mm:ss");
     /** 日志文件格式*/
    private static SimpleDateFormat logfile = new SimpleDateFormat("yyyy-MM-dd");


    /**
     * 警告信息
     * @param tag
     * @param msg
     */
    public static void w(String tag, Object msg) {
        if (MYLOG_SWITCH) {
            if (null != msg){
                log(tag, msg.toString(), 'w');
            }
        }
    }
  
    public static void e(String tag, Object msg) { // 错误信息
        if (MYLOG_SWITCH) {
            if (null != msg){
                log("<<core: "+tag+">> ", msg.toString(), 'e');
            }
        }
    }
  
    public static void d(String tag, Object msg) {// 调试信息
        if (MYLOG_SWITCH) {
            if (null != msg){
                log(tag, msg.toString(), 'd');
            }
        }
    }
  
    public static void i(String tag, Object msg) {//
        if (MYLOG_SWITCH) {
            log(tag, msg.toString(), 'i');
        }
    }
  
    public static void v(String tag, Object msg) {
        if (MYLOG_SWITCH) {
            if (null != msg){
                log(tag, msg.toString(), 'v');
            }
        }
    }
  
    public static void w(String tag, String text) {
        if (MYLOG_SWITCH) {
            if (null != text){
                log(tag, text, 'w');
            }
        }
    }
  
    public static void e(String tag, String text) {
        if (MYLOG_SWITCH) {
            if (null != text){
                log("<<core: "+tag+">> ", text, 'e');
            }
        }
    }
  
    public static void d(String tag, String text) {
        if (MYLOG_SWITCH) {
            if (null != text){
                log(tag, text, 'd');
            }
        }
    }
  
    public static void i(String tag, String text) {
        if (MYLOG_SWITCH) {
            if (null != text){
                log(tag, text, 'i');
            }
        }
    }
  
    public static void v(String tag, String text) {
        if (MYLOG_SWITCH) {
            if (null != text){
                log(tag, text, 'v');
            }
        }
    }
  
    /** 
     * 根据tag, msg和等级，输出日志 
     *  
     * @param tag 
     * @param msg 
     * @param level 
     * @return void 
     * @since v 1.0 
     */  
    private static void log(String tag, String msg, char level) {  
        if (MYLOG_SWITCH) {  
        	
            if ('e' == level && ('e' == MYLOG_TYPE || 'v' == MYLOG_TYPE)) { // 输出错误信息  
                Log.e(tag, msg);  
            } else if ('w' == level && ('w' == MYLOG_TYPE || 'v' == MYLOG_TYPE) && MYLOG_SWITCH_EXCEPT_ERROR ) {  
                Log.w(tag, msg);  
            } else if ('d' == level && ('d' == MYLOG_TYPE || 'v' == MYLOG_TYPE) && MYLOG_SWITCH_EXCEPT_ERROR ) {  
                Log.d(tag, msg);  
            } else if ('i' == level && ('d' == MYLOG_TYPE || 'v' == MYLOG_TYPE) && MYLOG_SWITCH_EXCEPT_ERROR ) {  
                Log.i(tag, msg);  
            } else if( MYLOG_SWITCH_EXCEPT_ERROR ){  
                Log.v(tag, msg);  
            }  
            if (MYLOG_WRITE_TO_FILE)  
                writeLogtoFile(String.valueOf(level), tag, msg);  
        }  
    }  
  
    /** 
     * 打开日志文件并写入日志 
     *  
     * @return 
     * **/  
    private static void writeLogtoFile(String mylogtype, String tag, String text) {// 新建或打开日志文件  
        Date nowtime = new Date();  
        String needWriteFiel = logfile.format(nowtime);  
        String needWriteMessage = myLogSdf.format(nowtime) + "    " + mylogtype  
                + "    " + tag + "    " + text;  
        File file = new File(MYLOG_PATH_SDCARD_DIR, needWriteFiel  
                + MYLOGFILEName);  
        try {  
            FileWriter filerWriter = new FileWriter(file, true);//后面这个参数代表是不是要接上文件中原来的数据，不进行覆盖  
            BufferedWriter bufWriter = new BufferedWriter(filerWriter);  
            bufWriter.write(needWriteMessage);  
            bufWriter.newLine();  
            bufWriter.close();  
            filerWriter.close();  
        } catch (IOException e) {  
            // TODO Auto-generated catch block  
            e.printStackTrace();  
        }  
    }  
  
    /** 
     * 删除制定的日志文件 
     * */  
    public static void delFile() {// 删除日志文件  
        String needDelFiel = logfile.format(getDateBefore());  
        File file = new File(MYLOG_PATH_SDCARD_DIR, needDelFiel + MYLOGFILEName);  
        if (file.exists()) {  
            file.delete();  
        }  
    }  
  
    /** 
     * 得到现在时间前的几天日期，用来得到需要删除的日志文件名 
     * */  
    private static Date getDateBefore() {  
        Date nowtime = new Date();  
        Calendar now = Calendar.getInstance();  
        now.setTime(nowtime);  
        now.set(Calendar.DATE, now.get(Calendar.DATE)  
                - SDCARD_LOG_FILE_SAVE_DAYS);  
        return now.getTime();  
    }

    public static class Builder{
        /**日志文件总开关*/
        private  Boolean mSwitch=true;
        /** 日志文件 error 以下总开关*/
        private  Boolean mErrorSwitch=true;
        /** 日志写入文件开关*/
        private  Boolean mWriterSwitch=false;
        /** 输入日志类型，w代表只输出告警信息等，v代表输出所有信息*/
        private  char mLogType='v';
        /** 日志文件在sdcard中的路径*/
        private  String mPathDir="/sdcard/";
        /** sd卡中日志文件的最多保存天数*/
        private  int mLogFileSaveDays = 0;
        /** 本类输出的日志文件名称*/
        private  String mLogFileName = "Log.txt";
        /** 日志的输出格式*/
        private  SimpleDateFormat myLogSdf = new SimpleDateFormat(
                "yyyy-MM-dd HH:mm:ss");
        /** 日志文件格式*/
        private  SimpleDateFormat logfile = new SimpleDateFormat("yyyy-MM-dd");

        public Builder allSwitch(Boolean mSwitch) {
            this.mSwitch = mSwitch;
            return this;
        }

        /**
         * 日志文件总开关
         * @param mErrorSwitch
         * @return
         */
        public Builder errorSwitch(Boolean mErrorSwitch) {
            this.mErrorSwitch = mErrorSwitch;
            return this;
        }

        /**
         * 日志文件 error 以下总开关
         * @param mWriterSwitch
         * @return
         */
        public Builder writerSwitch(Boolean mWriterSwitch) {
            this.mWriterSwitch = mWriterSwitch;
            return this;
        }

        /**
         * 输入日志类型，w代表只输出告警信息等，v代表输出所有信息
         * @param mLogType
         * @return
         */
        public Builder logType(char mLogType) {
            this.mLogType = mLogType;
            return this;
        }

        /**
         * 日志文件在sdcard中的路径
         * @param mPathDir
         * @return
         */
        public Builder pathDir(String mPathDir) {
            this.mPathDir = mPathDir;
            return this;
        }

        /**
         * sd卡中日志文件的最多保存天数
         * @param mLogFileSaveDays
         * @return
         */
        public Builder logFileSaveDays(int mLogFileSaveDays) {
            this.mLogFileSaveDays = mLogFileSaveDays;
            return this;
        }

        /**
         * 本类输出的日志文件名称
         * @param mLogFileName
         * @return
         */
        public Builder logFileName(String mLogFileName) {
            this.mLogFileName = mLogFileName;
            return this;
        }

        /**
         * 日志的输出格式
         * @param myLogSdf
         * @return
         */
        public Builder myLogSdf(SimpleDateFormat myLogSdf) {
            this.myLogSdf = myLogSdf;
            return this;
        }

        /**
         * 日志文件格式
         * @param logfile
         * @return
         */
        public Builder logfile(SimpleDateFormat logfile) {
            this.logfile = logfile;
            return this;
        }

        /**
         * 构建方法
         */
        public void build(){
            LogUtil.MYLOG_SWITCH=this.mSwitch;
            LogUtil.MYLOG_SWITCH_EXCEPT_ERROR=this.mErrorSwitch;
            LogUtil.MYLOG_WRITE_TO_FILE=this.mWriterSwitch;
            LogUtil.MYLOG_TYPE=this.mLogType;
            LogUtil.MYLOG_PATH_SDCARD_DIR=this.mPathDir;
            LogUtil.SDCARD_LOG_FILE_SAVE_DAYS=this.mLogFileSaveDays;
            LogUtil.MYLOGFILEName=this.mLogFileName;
            LogUtil.myLogSdf=this.myLogSdf;
            LogUtil.logfile=this.logfile;
            BlueLog.setIsDebug(this.mSwitch);
        }
    }

    /**
     * 是否为开发模式还是测试模式，true为开发模式， false为发布模式
     */
    public static boolean getLogType() {
        return MYLOG_SWITCH;
    }

    /**
     * 是否显示异常日志，true为打开， false为关闭
     */
    public static boolean getExceptionType() {
        return MYLOG_SWITCH_EXCEPT_ERROR;
    }
}
